package csm.web.core;

import java.net.URLEncoder;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.velocity.context.Context;

import csm.common.Logger;

/**
 * 일반적인 Layout template가 필요한 페이지를 처리하는 클래스
 * @author seungmun
 *
 */
public abstract class TemplateServletBase extends VelocityServletBase {

	/**	 */
	private static final long serialVersionUID = -168618982710103991L;
	private HttpSession session = null;


	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
	}
	/**
	 * 세션값을 얻어옵니다.
	 *
	 * @return
	 */
	protected final HttpSession getSession() {
		return session;
	}

	public abstract void populate(HttpServletRequest request,
			HttpServletResponse response, Context context) throws Exception;

	@Override
	protected void handleRequest(HttpServletRequest request,
			HttpServletResponse response, Context context) throws Exception {

		String themaName = "thema/default";
		try {
			// ******************************************************************************************************
			// 시스템의 구성적인 요소를 세팅한다. (encoding, locale, cookie speck 등등)
			// ******************************************************************************************************
			request.setCharacterEncoding("UTF-8");
			response.setCharacterEncoding("UTF-8");
			response.setHeader(	"P3P", "CP=\"NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE\"");
			ServletContext ctx = request.getSession().getServletContext();



			session = request.getSession();


			themaName = getThemaName(request);
			context.put("THEMA", themaName);

			// ******************************************************************************************************
			// TODO 이곳에서 모든 페이지에서 공통으로 사용할 파라메터를 세팅한다.
			// 주의 : 오류가 나서는 안된다. 오류가 발생하더라도, 세팅에 관련된 것들만 나타나야 한다.
			//        즉, 오류가 난다면, 어떤 요청이더라도 똑같이 오류가 발생할 것이다.
			// ******************************************************************************************************
			String queryString = request.getQueryString() != null && request.getQueryString().length() > 0 ? "?"	+ request.getQueryString() : "";
			context.put("CURRENT_URI", request.getRequestURI() + queryString);
			context.put("CURRENT_PATH",getRequestPath(request));
			context.put("ROOT_PATH", request.getContextPath()); // Root path
			context.put("ROOT_FULL_PATH",getRootFullPath(request)); // Root path
			context.put("USER_IP", getClientIp(request));
			if (!csm.common.StringUtil.isNullOrEmpty(request.getQueryString())) // 호출 URL
				context.put("REQUEST_URL",	URLEncoder.encode(String.format("%s?%s", request.getRequestURI(), request.getQueryString()), "UTF-8"));
			else
				context.put("REQUEST_URL", URLEncoder.encode(request.getRequestURI(), "UTF-8"));

			// ******************************************************************************************************
			// 현재 렌더링 하고자 하는 페이지에 대한 Validation을 한다.
			// Validation 항목 : 로그인 여부, 호출자가 administrator인지 등등등....
			// ******************************************************************************************************
			context.put("IS_ADMIN", "N");


			// ******************************************************************************************************
			// populate 를 override 하면서, 해당 기능에 필요한 파리메터를 세팅하게 된다.
			// 이러한 세팅은 populate를 구현하는 서블릿 - 서비스를 처리하는 서블릿 - 에서 직접 처리한다
			// 즉, 서비스 내용에 종속적인 내용들을 Validation하거나 SET 하는 것들은 해당 서블릿에서 처리한다.
			// (사실 좀 고민 된다...웹을 잘 아는 기술자가 판정해 주어야 할듯...)
			// ******************************************************************************************************
			populate(request, response, context);


		} catch (Exception e) {

			// TODO 각 서비스별로 예외를 세분화해서 정의하면 아주 좋겠다.

			//Logger.info(">>>>>>>>>>>>>> TemplateServletBase.handleRequest()");
			context.put("PAGE", themaName + "/errors/error.vm");
			context.put("ErrorMessage", e.getMessage());
			//e.printStackTrace(System.err);
			Logger.error(">>>>>>>>>>>>>> TemplateServletBase.handleRequest()", e);
			forward(context, request, response, themaName + "/templates/Default.Template.vm");
			return;
		}

		String path = getTemplateFile( request );
		forward(context, request, response, themaName + "/" + path);
	}


}
